package com.wjm.api;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;

/**
 * Data:2022年07月06日
 * Author:wjm
 * Content: 集合转换为数组，数组转换为集合，可变型参数
 *
 *
 *  Collection将集合转换为数组的方法
 *             public abstract <T> T[] toArray(@NotNull T[] a)
 *             public abstract Object[] toArray()
 *
 *  将数组转换为集合的方法
 *             public static <T> java.util.List<T> asList(@NotNull T... a)
 *             参数传入要转换的数组就可以，
 *             调用该方法的格式：Array，asList(数组名)
 *
 *  //@NotNull 表示的是不为空
 *  T...a 这个是可变参数
 *
 *
 *  什么是可变参数：
 *              在jdk1.5之后，如果我们定义了一个方法需要接收很多个参数，并且这些参数类型相同
 *            我们就可以把它写成如下格式
 *                修饰符 返回值类型 方法名(数据类型...变量名)
 *            等同于
 *                修饰符 返回值类型 方法名(参数类型[] 形参名)
 *
 *  可变参数原理：
 *            可变参数的底层本质就是一个数组，根据传递参数个数的不同，会创建不同长度的数组
 *  注意：
 *            1）修饰符 返回值类型 方法名(数据类型...a)这个传的参数可以是0个或多个
 *            2）修饰符 返回值类型 方法名(参数类型[] 形参名)数组做参数不能传0个，至少要传一个null
 *            3）可变参数只能放在参数列表的最后一位，如 public void method(String str,double d,int...a)
 *            4）一个方法只能有一个可变参数
 *
 */
public class CollectionDemo1 {
    public static void main(String[] args) {
        //集合转数组
        collectionToArray();
        System.out.println("--------------------------");
        //数组转集合
        arrayToList();

    }

    private static void arrayToList() {
        //创建数组
        String[] arr = {"a","b","c","d","e"};
        System.out.println("数组"+ Arrays.toString(arr));
        System.out.println("类型:"+arr.getClass().getName());
        //数组转集合
        Collection<String> collection = Arrays.asList(arr);
        System.out.println("集合"+collection);
        System.out.println("类型:"+collection.getClass().getName());
    }

    private static void collectionToArray() {
        //创建集合对象
        Collection<Integer> collection = new ArrayList<>();
        //给集合加元素
        for (int i=0; i<8;i++){
            collection.add(i);
        }
        System.out.println("集合"+collection);
        System.out.println("类型:"+collection.getClass().getName());
        //集合转数组的第一种方式
        // Integer[] aa = (Integer[])collection.toArray(); 进行强转运行会报错，只能用Object[]数组接收
        Object[] objects = collection.toArray();
        System.out.println("数组"+ Arrays.toString(objects));
        System.out.println("类型:"+objects.getClass().getName());

        //第二种方式（推荐使用）
        Integer[] aa = collection.toArray(new Integer[] {}); //不用强转直接可以指定类型
        System.out.println("数组"+ Arrays.toString(aa));
        System.out.println("类型:"+aa.getClass().getName());
    }
}
